using Microsoft.Extensions.Logging;
using TaskScheduler.Core;

namespace TaskScheduler.Tasks;

/// <summary>
/// 清理任务示例
/// 定期清理临时文件和过期数据
/// </summary>
public class CleanupTask : ITask
{
    private readonly ILogger<CleanupTask> _logger;

    public CleanupTask(ILogger<CleanupTask> logger)
    {
        _logger = logger;
    }

    public string TaskName => "CleanupTask";
    public string Description => "清理任务 - 每天凌晨3点执行";
    public bool IsEnabled => true;
    public string CronExpression => "0 3 * * *"; // 每天凌晨3点执行

    public async Task<TaskResult> ExecuteAsync(CancellationToken cancellationToken = default)
    {
        try
        {
            _logger.LogInformation("开始执行清理任务...");

            int totalCleaned = 0;

            // 1. 清理临时文件
            var tempFileCount = await CleanTempFilesAsync(cancellationToken);
            totalCleaned += tempFileCount;
            _logger.LogInformation("清理临时文件: {Count} 个", tempFileCount);

            // 2. 清理过期日志
            var logCount = await CleanExpiredLogsAsync(cancellationToken);
            totalCleaned += logCount;
            _logger.LogInformation("清理过期日志: {Count} 条", logCount);

            // 3. 清理数据库过期数据
            var dbRecordCount = await CleanExpiredDatabaseRecordsAsync(cancellationToken);
            totalCleaned += dbRecordCount;
            _logger.LogInformation("清理数据库过期数据: {Count} 条", dbRecordCount);

            return new TaskResult
            {
                IsSuccess = true,
                Message = $"清理完成，共清理 {totalCleaned} 项"
            };
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "清理任务执行失败");
            return new TaskResult
            {
                IsSuccess = false,
                Message = ex.Message,
                Exception = ex
            };
        }
    }

    /// <summary>
    /// 清理临时文件
    /// </summary>
    private async Task<int> CleanTempFilesAsync(CancellationToken cancellationToken)
    {
        try
        {
            await Task.Delay(100, cancellationToken);
            
            // 这里是示例代码，实际使用时需要根据项目需求清理特定目录的临时文件
            // var tempPath = Path.Combine(Path.GetTempPath(), "YourApp");
            // if (Directory.Exists(tempPath))
            // {
            //     var files = Directory.GetFiles(tempPath)
            //         .Where(f => File.GetCreationTime(f) < DateTime.Now.AddDays(-7));
            //     foreach (var file in files)
            //     {
            //         File.Delete(file);
            //     }
            // }
            
            return 15; // 模拟清理了15个文件
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "清理临时文件失败");
            return 0;
        }
    }

    /// <summary>
    /// 清理过期日志
    /// </summary>
    private async Task<int> CleanExpiredLogsAsync(CancellationToken cancellationToken)
    {
        try
        {
            await Task.Delay(100, cancellationToken);
            
            // 这里是示例代码，实际使用时需要清理真实的日志文件
            // 例如：删除30天前的日志文件
            
            return 8; // 模拟清理了8个日志文件
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "清理过期日志失败");
            return 0;
        }
    }

    /// <summary>
    /// 清理数据库过期记录
    /// </summary>
    private async Task<int> CleanExpiredDatabaseRecordsAsync(CancellationToken cancellationToken)
    {
        try
        {
            await Task.Delay(100, cancellationToken);
            
            // 这里是示例代码，实际使用时需要执行真实的数据库删除操作
            // 例如：删除90天前的临时数据
            // using var db = _dbContext;
            // var expiredDate = DateTime.Now.AddDays(-90);
            // var count = await db.Deleteable<TempData>()
            //     .Where(t => t.CreateTime < expiredDate)
            //     .ExecuteCommandAsync(cancellationToken);
            
            return 42; // 模拟清理了42条记录
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "清理数据库过期记录失败");
            return 0;
        }
    }
}

